// 20. 有效的括号
// 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串，判断字符串是否有效。
// 有效字符串需满足：
// 左括号必须用相同类型的右括号闭合。
// 左括号必须以正确的顺序闭合。
// 注意空字符串可被认为是有效字符串。
// 遇到左括号进行入栈，遇到右括号判断栈顶元素是否与当前字符匹配，如果匹配则出栈，否则返回false，最后检查栈是否为空，如果为空说明完全匹配，返回true，否则返回false。JavaScript实现利用数组的push和pop方法实现元素的入栈和出栈。
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
  var sub = []
  var len = s.length
  var leftSymbol = ['(', '[', '{']
  for (var i = 0; i < len; i++) {
    // 遇到左括号添加进入数组
    if (leftSymbol.indexOf(s[i]) > -1) {
      sub.push(s[i])
    } else if (s[i] === ')') { // 如果是右括号 检测最近的左括号
      if (sub[sub.length - 1] === '(') {
        sub.pop()
      } else {
        return false
      }
    } else if (s[i] === ']') {
      if (sub[sub.length - 1] === '[') {
        sub.pop()
      } else {
        return false
      }
    } else if (s[i] === '}') {
      if (sub[sub.length - 1] === '{') {
        sub.pop()
      } else {
        return false
      }
    }
  }
  if (sub.length > 0) {
    return false
  } else {
    return true
  }
}

var result = isValid('([])')
console.log('result', result)